﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SmartMarketTelas.localhost;
using System.Data.SqlClient;
using System.Collections;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace SmartMarketTelas
{
    public partial class FormCompra : Form
    {
        public static string retornoTexto(string entrada)
        {
            return entrada.Split(new char[] { '\n' })[0].Split(new char[] { ':' })[2];
        }



        bool teste;
        private Thread thread;
        Service1 servico = new Service1();
        private NetworkStream networkStream;
        private BinaryWriter binaryWriter;
        private BinaryReader binaryReader;
        int codigo = 0;
        List<Produto> lista = new List<Produto>();
        TcpClient cliente;
        TcpListener listener;
        Cliente clie = new Cliente();
        Compra compra = new Compra();
        private TcpClient tcpClient;

        List<Produto> grid = new List<Produto>();
        Produto produto = new Produto();

        public FormCompra(Cliente c)
        {
            InitializeComponent();
            compra.Cliente = c;
            label2.Text = "Nome do Cliente: " + compra.Cliente.Nome ;
            FormLogin fl = new FormLogin();
            fl.Hide();

        }
        public void Iniciar()
        {
            teste = false;
            thread = new Thread(new ThreadStart(RunClient));
            thread.Start();
            if (thread.IsAlive) { teste = true; }
            
        }
        

        private void AddToDataGrid(string mensagem)
        {
            codigo = Convert.ToInt32(mensagem);
            Invoke(new MethodInvoker(
                           delegate
                           {
                               try
                               {
                                   produto.Codigo = codigo;
                                   lista = servico.addProduto(produto).ToList();
                                   // MessageBox.Show(lista.Count.ToString());
                                   foreach (Produto p in lista)
                                   {
                                       grid.Add(p);
                                       compra.ValorTotal = compra.ValorTotal + p.ValorUnit;
                                       //     MessageBox.Show(grid.IndexOf(p).ToString());     
                                   }
                                   gridProduto.DataSource = null;
                                   gridProduto.DataSource = grid;
                                   //  int codigo2 = Convert.ToInt32(textBox1.Text);
                               }
                               catch (Exception ex) { MessageBox.Show(retornoTexto(ex.Message)); }
                           }
                           ));
        }

        private void conectar()
        {
            //bool retorno = false;
            
                try
                {
                    cliente = new TcpClient();
                    cliente.Connect("127.0.0.1", 2001);
                  //  retorno = true;
                }

                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message + "erro de conexão");
                }  
            
            
          
                  }

        private void desconectar()
        {

            try
            {
                binaryWriter.Close();
                binaryReader.Close();
                networkStream.Close();
                cliente.Close();

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message+"mamae");
            }

        }


        public void RunClient()


        {
            try
            {
                conectar();
                networkStream = cliente.GetStream();
                binaryWriter = new BinaryWriter(networkStream);
                binaryReader = new BinaryReader(networkStream);

                String message = "";
                do
                {
                    try
                    {
                        message = binaryReader.ReadString();
                        AddToDataGrid(message);
                    }
                    catch (Exception )
                    {
                        MessageBox.Show("carrinho desconectado.","Carrinho diz");
                        message = "FIM";
                    }
                } while (message != "FIM");

                desconectar();
             } catch(Exception ){

                 MessageBox.Show("aguarde o outro carrinho estar preparado para agregar");
            
            }    
           }
        
        
        
    private void button2_Click(object sender, EventArgs e)
        {
        try
            {

                Produto produto = new Produto();
                if (textBox1.Text == "")
                {
                    MessageBox.Show("Informe o código");
                }

                produto.Codigo = Convert.ToInt32(textBox1.Text);
                string mensagem = codigo.ToString();
               
                List<Produto> lista = servico.addProduto(produto).ToList();
                // grid = new List<Produto>();
                // grid.Clear();

                //grid = null;

                foreach (Produto p in lista)
                {
                    //  grid = new List<Produto>();
                    grid.Add(p);
                    compra.ValorTotal = compra.ValorTotal + p.ValorUnit;
                    //  MessageBox.Show(p.Nome);
                }


                //  int codigo2 = Convert.ToInt32(textBox1.Text);
                gridProduto.DataSource = null;
                gridProduto.DataSource = grid;

                if (teste) { binaryWriter.Write(textBox1.Text); }
            
                textBox1.Clear();
                

            }
            catch (Exception ex)
            {

                MessageBox.Show(retornoTexto(ex.Message));
                textBox1.Clear();
            }    
        }

            
        
            

        
        

        


      

        //private void button5_Click(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        binaryWriter.Write("Server respondendo: Houston, we have a problem!!!");
        //    }
        //    catch (SocketException socketEx)
        //    {
        //        MessageBox.Show(socketEx.Message, "Erro");
        //    }
        //    catch (Exception socketEx)
        //    {
        //        MessageBox.Show(socketEx.Message, "Erro");
        //    }
        //}

        private void button1_Click(object sender, EventArgs e)
        {
            Service1 serv = new Service1();
            Compra compra = new Compra();
        }

        private void FormCompra_Load(object sender, EventArgs e)
        {
            
            grid = new List<Produto>();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;

            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            Iniciar();
            button1.Enabled = false;
        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            //desconectar();
            Environment.Exit(0);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {

                compra.Produtos = grid.ToArray();

                MessageBox.Show(compra.Produtos.Length.ToString());
                Service1 serv = new Service1();
                serv.FinalizarCompra(compra);
                MessageBox.Show("compra efetuada com sucesso");

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
        }
    }
}
